/*
 * @Author: wwssaabb
 * @Date: 2021-12-04 14:13:06
 * @LastEditTime: 2021-12-04 15:13:10
 * @FilePath: \handwritten-code\algorithm\长度最小的子数组.js
 */

/* 
给定一个含有 n 个正整数的数组和一个正整数 target。
找出该数组中满足其和≥ target 的长度最小的 连续子数组[numsl, numsl + 1, ..., numsr - 1, numsr]， 并返回其长度。 如果不存在符合条件的子数组， 返回 0。

示例 1：
输入： target = 7, nums = [2, 3, 1, 2, 4, 3]
输出： 2
解释： 子数组[4, 3] 是该条件下的长度最小的子数组。

示例 2：
输入： target = 4, nums = [1, 4, 4]
输出： 1

示例 3：
输入： target = 11, nums = [1, 1, 1, 1, 1, 1, 1, 1]
输出： 0

来源： 力扣（ LeetCode）
链接： https: //leetcode-cn.com/problems/minimum-size-subarray-sum
*/

//滑动窗口（双指针），时间复杂度O(n)，空间复杂度O(1)
var minSubArrayLen = function (target, nums) {
  let res = nums.length + 1,
    l = r = sum = 0
  while (r < nums.length) {
    sum += nums[r++]
    while (sum >= target) {
      res = Math.min(res, r - l)
      sum -= nums[l++]
    }
  }
  return res === nums.length + 1 ? 0 : res
};

console.log(minSubArrayLen(7, [2, 3, 1, 2, 4, 3])) //2
console.log(minSubArrayLen(9, [2, 3, 1, 2, 4, 3])) //3
console.log(minSubArrayLen(11, [1, 1, 1, 1, 1, 1, 1, 1])) //3